[t:/]$ 지식_

귀찮아 데몬화

2019/01/07

자세한 설명은 생략한다. log 모듈은 troot 블로그에 있다.
stderr가 현재 /dev/null에 붙어있는데 주석처리하고 로깅하면 된다.

#-*- coding: utf-8 -*-
import os
import sys
import signal
from log import log, WARN, INFO

def _sig_stop(signum, frame):
    log(INFO, 'SIGSTOP, 프로세스를 종료합니다. pid = ' + str(os.getpid()))
    exit()

g_pid_file_name = ''

def daemon_init(pid_filename = 'getTc.pid', deploy_mode = 'stop'):

    global g_pid_filename

    g_pid_filename = pid_filename

    try:
        with open(pid_filename) as pid_file:
            try:
        pid = pid_file.readline()
        log(INFO, '이전 프로세스가 존재하여 종료합니다. pid = ' + pid)
                os.kill(int(pid), signal.SIGKILL)
            except:
        log(INFO, '이전 프로세스 제거에 실패하였습니다. 점검을 요합니다')

        try:
            os.remove(pid_filename)
    except:
        log(INFO, 'pid 파일 제거에 실패하였습니다. 점검을 요합니다')

    except:
        log(INFO, 'pid 파일이 없으므로 바로 기동합니다')

    if deploy_mode == 'stop':
        exit(0)

def daemon_start():

    global g_pid_filname

    pid = os.fork()
    if pid > 0:
        exit(0)

    else:
        os.setsid()
        os.umask(0)

        pid = os.fork()
        if pid > 0:
            exit(0)
        else:
            sys.stdout.flush()
            sys.stderr.flush()

            if 1:

                si = open(os.devnull, 'r')
                so = open(os.devnull, 'a+')
                se = open(os.devnull, 'a+')

                os.dup2(si.fileno(), sys.stdin.fileno())
                os.dup2(so.fileno(), sys.stdout.fileno())
                os.dup2(se.fileno(), sys.stderr.fileno())

            pid = str(os.getpid())
            with open(g_pid_filename, 'w') as pid_file:
                pid_file.write(pid)

            signal.signal(signal.SIGINT, _sig_stop)
            signal.signal(signal.SIGTERM, _sig_stop)

        log(INFO, '데몬 모드로 실행합니다. pid = ' + pid)

def main():
    from env import env_init
    env_init()
    daemon_init()
    daemon_start()
    from time import sleep
    from env import env_init

    while True:
    print 'kk'
    sleep(1)

if __name__ == '__main__':
    main()




공유하기













[t:/] is not "technology - root". dawnsea, rss